package com.vue3.blog.service.impl;

import cn.hutool.core.util.IdUtil;
import com.vue3.blog.common.resp.BizException;
import com.vue3.blog.common.util.StrUtil2;
import com.vue3.blog.service.IFileUploadService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

/**
 * @author Mr.小朱同学
 * @version 1.0.0
 * @date 2025/6/11 12:57
 * @description 文件上传
 */
@Slf4j
@Service
public class FileUploadService implements IFileUploadService {
    /**
     * 图片上传
     */
    @Override
    public String uploadImage(MultipartFile file) {
        try {
            // 获取文件名称
            String originalFilename = StrUtil2.nvl(file.getOriginalFilename(), "image.jpeg");
            // 获取文件上传的目录路径
            String dir = "/static/article/";
            // 获取 classpath 类路径
            String path = ResourceUtils.getURL("classpath:").getPath() + dir;
            // 创建 File 文件目录对象
            File filePath = new File(path);
            // 判断文件目录是否存在
            if (!filePath.exists()) {
                // 目录不存在, 则创建目录
                filePath.mkdirs();
            }
            // 使用 UUID 生成唯一文件名，防止文件覆盖
            String newFileName = IdUtil.fastUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
            // 创建上传之后的文件全路径名称
            File uploadPath = new File(filePath, newFileName);
            // 上传文件
            file.transferTo(uploadPath);
            return dir + newFileName;
        } catch (IOException e) {
            log.error("文件上传失败：{}", e.getMessage());
            throw new BizException("文件上传失败：", e);
        }
    }
}